/*********************************************************************
* File: IFreeNavigation.h
*
* Supports automatic navigation to positions in the world.
*********************************************************************/
#pragma once

namespace agents{namespace interfaces{
	/**
	* \class IFreeNavigation
	* \brief Supports automatic navigation to positions in the world.
	*
	* Supports automatic navigation to an arbitrary position in the world, 
	* provided that it is reachable and the direct path is collision-free
	*
	* \author Instituto Superior Tecnico de Lisboa, Portugal
	* \author Technical University of Lisbon, Portugal
	* 
	* \author Agentes Autonomos e Sistemas Multiagente
	* \author Autonomous Agents and Multiagent Systems
	* 
	* \version	1.0
	* \date		2006/2007
	**/
	class IFreeNavigation
	{
	public:
		/** 
		* \brief Constant representing that no destination is set. 
		**/
		static const Vector destinationUndefined;

		/**
		* \brief Moves the agent towards a position in the world.
		*
		* The agent's actuators are automatically invoked, for as many 
		* cycles as necessary, so as to guide the agent towards the position. 
		* However, generally, the agent will only reach positions which are 
		* reachable and the direct path is collision-free.
		* 
		* \param[in] position the destination position
		**/
		virtual void moveToDestination(Vector position) = 0;
		/**
		* \brief Returns the agent's current destination.
		*
		* If no destination is set return #destinationUndefined
		**/
		virtual Vector getDestination() = 0;
		/**
		* \brief Whether the agent has reached the intended position.
		**/
		virtual bool reachedDestination() = 0;
		/**
		* \brief Stops the agent.
		*
		* Immediately stops the agent, ceasing to try to reach a destination.
		**/
		virtual void stop() = 0;
	};
}}
